java Spring Websocket处理程序未向所有客户端发布消息
我有一个Spring Websocket服务器,非常简单:
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry webSocketHandlerRegistry) {
webSocketHandlerRegistry.addHandler(new WebsocketHandler(), "/socket").setAllowedOrigins("*");
}
@Bean
public ServletServerContainerFactoryBean createWebSocketContainer() {
ServletServerContainerFactoryBean container = new ServletServerContainerFactoryBean();
container.setMaxBinaryMessageBufferSize(1024000);
container.setMaxTextMessageBufferSize(1024000);
return container;
}
}
及
public class WebsocketHandler extends AbstractWebSocketHandler {
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws IOException {
System.out.println(message.getPayload()+"\n");
session.sendMessage(message);
}
@Override
protected void handleBinaryMessage(WebSocketSession session, BinaryMessage message) throws IOException {
System.out.println("New Binary Message Received");
session.sendMessage(message);
}
}
当我打开客户端时,它只是一个带有SockJS库的简单HTML,客户端可以从服务器发送接收消息,但是如果我用类似的客户端打开一个新选项卡,它将无法接收其他客户端发布的消息
这是因为session.sendMessage(message);
吗?当一个客户机发布消息时,所有其他客户机都能够接收到该消息的配置应该是什么
# 1 楼答案
如果要将数据发送到其他客户端,则需要跟踪会话。正如您在这个LINK的文档中所看到的,处理程序还有两个函数用于连接打开后和连接关闭后。这对你有什么帮助? 您可以保留像
CopyOnWriteList<T>
这样的同步集合或使用Collections.Synchronized
,当客户端连接(afterConnectionEstablished(WebSocketSession session)
)、将此客户端添加到此集合中或当客户端断开连接(afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus)
)时,您可以从集合中删除会话。当您想要向每个客户机发送消息时,循环此集合并使用会话发送对象。如果您仍然感到困惑,我可以提供一个代码示例